|
ARD2
RC2
Airbag Reference Demonstrator using MPC5604P
|
00001 00017 #include "derivative.h" 00018 #include "Compile_Options.h" 00019 #include "CG147.h" 00020 #include "MMA51xx.h" 00021 /* 00022 ****************************************************************************** 00023 * Constants 00024 ****************************************************************************** 00025 */ 00026 00027 /* 00028 ****************************************************************************** 00029 * Globals 00030 ****************************************************************************** 00031 */ 00032 static uint8_t gu8MMA5100Settings; 00033 static uint8_t gu8MMA5100IndexAdder; 00034 00035 uint16_t u16fnMMA5100TreatData(uint16_t* pu16SatData, 00036 uint8_t* pu8ResultArray, 00037 uint8_t* pu8CurrentIndex, 00038 uint8_t* pu8IndexAdder, 00039 uint32_t* pu32AlreadyWritten) 00040 { 00041 /* Locals */ 00042 uint16_t u16Status; 00043 00044 /* Init locals */ 00045 u16Status = CLEAR; 00046 00047 /* Verify that the gathered data is not an accel value */ 00048 if((*pu16SatData < MMA5100_UL_FOR_DATA) & *pu16SatData > MMA5100_LL_FOR_DATA) 00049 { 00050 /* Verify that the gathered data is in fact data */ 00051 if(*pu16SatData & MMA5100_DATA_INDICATOR) 00052 { 00053 /* We have data */ 00054 gu8MMA5100Settings = (uint8_t)(*pu16SatData & MMA5100_CONTENTS_MASK); 00055 switch(*pu8CurrentIndex) 00056 { 00057 case (MMA5100_D1): 00058 { 00059 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D1)) == CLEAR) 00060 { 00061 pu8ResultArray[PROTOCOL] = gu8MMA5100Settings; 00062 *pu32AlreadyWritten |= (BIT0 << MMA5100_D1); 00063 } 00064 else 00065 { 00066 /* Nothing */ 00067 } 00068 break; 00069 } 00070 case (MMA5100_D2): 00071 { 00072 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D2)) == CLEAR) 00073 { 00074 pu8ResultArray[N_DATA_BLOCKS] = (gu8MMA5100Settings 00075 << BITS_IN_NIBBLE); 00076 *pu32AlreadyWritten |= (BIT0 << MMA5100_D2); 00077 } 00078 else 00079 { 00080 /* Nothing */ 00081 } 00082 break; 00083 } 00084 case (MMA5100_D3): 00085 { 00086 00087 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D3)) == CLEAR) 00088 { 00089 pu8ResultArray[N_DATA_BLOCKS] &= 0xF0u; 00090 pu8ResultArray[N_DATA_BLOCKS] |= gu8MMA5100Settings; 00091 *pu32AlreadyWritten |= (BIT0 << MMA5100_D3); 00092 } 00093 else 00094 { 00095 /* Nothing */ 00096 } 00097 break; 00098 } 00099 case (MMA5100_D4): 00100 { 00101 00102 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D4)) == CLEAR) 00103 { 00104 pu8ResultArray[MANUFACTURER] = (gu8MMA5100Settings 00105 << BITS_IN_NIBBLE); 00106 *pu32AlreadyWritten |= (BIT0 << MMA5100_D4); 00107 } 00108 else 00109 { 00110 /* Nothing */ 00111 } 00112 break; 00113 } 00114 case (MMA5100_D5): 00115 { 00116 00117 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D5)) == CLEAR) 00118 { 00119 pu8ResultArray[MANUFACTURER] &= 0xF0u; 00120 pu8ResultArray[MANUFACTURER] |= gu8MMA5100Settings; 00121 *pu32AlreadyWritten |= (BIT0 << MMA5100_D5); 00122 } 00123 else 00124 { 00125 /* Nothing */ 00126 } 00127 break; 00128 } 00129 case (MMA5100_D6): 00130 { 00131 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D6)) == CLEAR) 00132 { 00133 pu8ResultArray[SENSOR_TYPE] 00134 = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00135 *pu32AlreadyWritten |= (BIT0 << MMA5100_D6); 00136 } 00137 else 00138 { 00139 /* Nothing */ 00140 } 00141 break; 00142 } 00143 case (MMA5100_D7): 00144 { 00145 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D7)) == CLEAR) 00146 { 00147 pu8ResultArray[SENSOR_TYPE] &= 0xF0u; 00148 pu8ResultArray[SENSOR_TYPE] |= gu8MMA5100Settings; 00149 *pu32AlreadyWritten |= (BIT0 << MMA5100_D7); 00150 } 00151 else 00152 { 00153 /* Nothing */ 00154 } 00155 break; 00156 } 00157 case (MMA5100_D8): 00158 { 00159 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D8)) == CLEAR) 00160 { 00161 pu8ResultArray[AXIS] = gu8MMA5100Settings; 00162 *pu32AlreadyWritten |= (BIT0 << MMA5100_D8); 00163 } 00164 else 00165 { 00166 /* Nothing */ 00167 } 00168 break; 00169 } 00170 case (MMA5100_D9): 00171 { 00172 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D9)) == CLEAR) 00173 { 00174 pu8ResultArray[RANGE] = gu8MMA5100Settings; 00175 *pu32AlreadyWritten |= (BIT0 << MMA5100_D9); 00176 } 00177 else 00178 { 00179 /* Nothing */ 00180 } 00181 break; 00182 } 00183 case (MMA5100_D10): 00184 { 00185 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D10)) == CLEAR) 00186 { 00187 pu8ResultArray[DEVCFG2] = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00188 *pu32AlreadyWritten |= (BIT0 << MMA5100_D10); 00189 } 00190 else 00191 { 00192 /* Nothing */ 00193 } 00194 break; 00195 } 00196 case (MMA5100_D11): 00197 { 00198 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D11)) == CLEAR) 00199 { 00200 pu8ResultArray[DEVCFG2] &= 0xF0u; 00201 pu8ResultArray[DEVCFG2] |= gu8MMA5100Settings; 00202 *pu32AlreadyWritten |= (BIT0 << MMA5100_D11); 00203 } 00204 else 00205 { 00206 /* Nothing */ 00207 } 00208 break; 00209 } 00210 case (MMA5100_D12): 00211 { 00212 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D12)) == CLEAR) 00213 { 00214 pu8ResultArray[PRODUCT_REVISION] = (gu8MMA5100Settings 00215 << BITS_IN_NIBBLE); 00216 *pu32AlreadyWritten |= (BIT0 << MMA5100_D12); 00217 } 00218 else 00219 { 00220 /* Nothing */ 00221 } 00222 break; 00223 } 00224 case (MMA5100_D13): 00225 { 00226 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D13)) == CLEAR) 00227 { 00228 pu8ResultArray[PRODUCT_REVISION] &= 0xF0u; 00229 pu8ResultArray[PRODUCT_REVISION] |= gu8MMA5100Settings; 00230 *pu32AlreadyWritten |= (BIT0 << MMA5100_D13); 00231 } 00232 else 00233 { 00234 /* Nothing */ 00235 } 00236 break; 00237 } 00238 case (MMA5100_D14): 00239 { 00240 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D14)) == CLEAR) 00241 { 00242 pu8ResultArray[DEVCFG6] = gu8MMA5100Settings; 00243 *pu32AlreadyWritten |= (BIT0 << MMA5100_D14); 00244 } 00245 else 00246 { 00247 /* Nothing */ 00248 } 00249 break; 00250 } 00251 case (MMA5100_D15): 00252 { 00253 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D15)) == CLEAR) 00254 { 00255 pu8ResultArray[PROD_DATE_1] 00256 = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00257 *pu32AlreadyWritten |= (BIT0 << MMA5100_D15); 00258 } 00259 else 00260 { 00261 /* Nothing */ 00262 } 00263 break; 00264 } 00265 case (MMA5100_D16): 00266 { 00267 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D16)) == CLEAR) 00268 { 00269 pu8ResultArray[PROD_DATE_1] &= 0xF0u; 00270 pu8ResultArray[PROD_DATE_1] |= gu8MMA5100Settings; 00271 *pu32AlreadyWritten |= (BIT0 << MMA5100_D16); 00272 } 00273 else 00274 { 00275 /* Nothing */ 00276 } 00277 break; 00278 } 00279 case (MMA5100_D17): 00280 { 00281 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D17)) == CLEAR) 00282 { 00283 pu8ResultArray[PROD_DATE_2] 00284 = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00285 *pu32AlreadyWritten |= (BIT0 << MMA5100_D17); 00286 } 00287 else 00288 { 00289 /* Nothing */ 00290 } 00291 break; 00292 } 00293 case (MMA5100_D18): 00294 { 00295 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D18)) == CLEAR) 00296 { 00297 pu8ResultArray[PROD_DATE_2] &= 0xF0u; 00298 pu8ResultArray[PROD_DATE_2] |= gu8MMA5100Settings; 00299 *pu32AlreadyWritten |= (BIT0 << MMA5100_D18); 00300 } 00301 else 00302 { 00303 /* Nothing */ 00304 } 00305 break; 00306 } 00307 case (MMA5100_D19): 00308 { 00309 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D19)) == CLEAR) 00310 { 00311 pu8ResultArray[SN0] = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00312 *pu32AlreadyWritten |= (BIT0 << MMA5100_D19); 00313 } 00314 else 00315 { 00316 /* Nothing */ 00317 } 00318 break; 00319 } 00320 case (MMA5100_D20): 00321 { 00322 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D20)) == CLEAR) 00323 { 00324 pu8ResultArray[SN0] &= 0xF0u; 00325 pu8ResultArray[SN0] |= gu8MMA5100Settings; 00326 *pu32AlreadyWritten |= (BIT0 << MMA5100_D20); 00327 } 00328 else 00329 { 00330 /* Nothing */ 00331 } 00332 break; 00333 } 00334 case (MMA5100_D21): 00335 { 00336 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D21)) == CLEAR) 00337 { 00338 pu8ResultArray[SN1] = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00339 *pu32AlreadyWritten |= (BIT0 << MMA5100_D21); 00340 } 00341 else 00342 { 00343 /* Nothing */ 00344 } 00345 break; 00346 } 00347 case (MMA5100_D22): 00348 { 00349 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D22)) == CLEAR) 00350 { 00351 pu8ResultArray[SN1] &= 0xF0u; 00352 pu8ResultArray[SN1] |= gu8MMA5100Settings; 00353 *pu32AlreadyWritten |= (BIT0 << MMA5100_D22); 00354 } 00355 else 00356 { 00357 /* Nothing */ 00358 } 00359 break; 00360 } 00361 case (MMA5100_D23): 00362 { 00363 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D23)) == CLEAR) 00364 { 00365 pu8ResultArray[SN2] = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00366 *pu32AlreadyWritten |= (BIT0 << MMA5100_D23); 00367 } 00368 else 00369 { 00370 /* Nothing */ 00371 } 00372 break; 00373 } 00374 case (MMA5100_D24): 00375 { 00376 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D24)) == CLEAR) 00377 { 00378 pu8ResultArray[SN2] &= 0xF0u; 00379 pu8ResultArray[SN2] |= gu8MMA5100Settings; 00380 *pu32AlreadyWritten |= (BIT0 << MMA5100_D24); 00381 } 00382 else 00383 { 00384 /* Nothing */ 00385 } 00386 break; 00387 } 00388 case (MMA5100_D25): 00389 { 00390 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D25)) == CLEAR) 00391 { 00392 pu8ResultArray[SN3] = (gu8MMA5100Settings << BITS_IN_NIBBLE); 00393 *pu32AlreadyWritten |= (BIT0 << MMA5100_D25); 00394 } 00395 else 00396 { 00397 /* Nothing */ 00398 } 00399 break; 00400 } 00401 case (MMA5100_D26): 00402 { 00403 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D26)) == CLEAR) 00404 { 00405 pu8ResultArray[SN3] &= ((uint8_t)0xF0u); 00406 pu8ResultArray[SN3] |= gu8MMA5100Settings; 00407 *pu32AlreadyWritten |= (BIT0 << MMA5100_D26); 00408 } 00409 else 00410 { 00411 /* Nothing */ 00412 } 00413 break; 00414 } 00415 case (MMA5100_D27): 00416 { 00417 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D27)) == CLEAR) 00418 { 00419 pu8ResultArray[INIT_RAW_OFFSET] = gu8MMA5100Settings; 00420 *pu32AlreadyWritten |= (BIT0 << MMA5100_D27); 00421 } 00422 else 00423 { 00424 /* Nothing */ 00425 } 00426 break; 00427 } 00428 case (MMA5100_D28): 00429 { 00430 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D28)) == CLEAR) 00431 { 00432 pu8ResultArray[INIT_RAW_OFFSET] &= ((uint8_t)0x0Fu); 00433 pu8ResultArray[INIT_RAW_OFFSET] |= (gu8MMA5100Settings 00434 << BITS_IN_NIBBLE); 00435 *pu32AlreadyWritten |= (BIT0 << MMA5100_D28); 00436 } 00437 else 00438 { 00439 /* Nothing */ 00440 } 00441 break; 00442 } 00443 case (MMA5100_D29): 00444 { 00445 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D29)) == CLEAR) 00446 { 00447 pu8ResultArray[COMBINED_OFFSET_SELF_TEST] = gu8MMA5100Settings; 00448 *pu32AlreadyWritten |= (BIT0 << MMA5100_D29); 00449 } 00450 else 00451 { 00452 /* Nothing */ 00453 } 00454 break; 00455 } 00456 case (MMA5100_D30): 00457 { 00458 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D30)) == CLEAR) 00459 { 00460 pu8ResultArray[AVG_SELF_TEST] = gu8MMA5100Settings; 00461 *pu32AlreadyWritten |= (BIT0 << MMA5100_D30); 00462 } 00463 else 00464 { 00465 /* Nothing */ 00466 } 00467 break; 00468 } 00469 case (MMA5100_D31): 00470 { 00471 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D31)) == CLEAR) 00472 { 00473 pu8ResultArray[AVG_SELF_TEST] &= ((uint8_t)0x0Fu); 00474 pu8ResultArray[AVG_SELF_TEST] |= (gu8MMA5100Settings 00475 << BITS_IN_NIBBLE); 00476 *pu32AlreadyWritten |= (BIT0 << MMA5100_D31); 00477 } 00478 else 00479 { 00480 /* Nothing */ 00481 } 00482 break; 00483 } 00484 case (MMA5100_D32): 00485 { 00486 if((*pu32AlreadyWritten & (BIT0 << MMA5100_D32)) == CLEAR) 00487 { 00488 pu8ResultArray[DEVCFG1] = gu8MMA5100Settings; 00489 *pu32AlreadyWritten |= (BIT0 << MMA5100_D32); 00490 } 00491 else 00492 { 00493 /* Nothing */ 00494 } 00495 break; 00496 } 00497 default: 00498 { 00499 u16Status = MMA5100_COMMAND_NOT_RECOGNIZED; 00500 break; 00501 } 00502 } 00503 } 00504 else 00505 { 00506 /* This is an index. Let's store it. */ 00507 *pu8CurrentIndex = ((uint8_t)(*pu16SatData & MMA5100_CONTENTS_MASK) 00508 + *pu8IndexAdder); 00509 00510 /* Remember if we need to go to the second page */ 00511 if(*pu8CurrentIndex == MMA5100_D16) 00512 { 00513 *pu8IndexAdder = MMA5100_D17; 00514 } 00515 else 00516 { 00517 /* Nothing */ 00518 } 00519 } 00520 } 00521 else 00522 { 00523 /* This is not data; it's a status word */ 00524 switch(*pu16SatData) 00525 { 00526 case (MMA5100_SENSOR_DEFECT): 00527 { 00528 u16Status = MMA5100_SENSOR_DEFECT_STATUS; 00529 break; 00530 } 00531 case (MMA5100_SENSOR_BUSY): 00532 { 00533 u16Status = MMA5100_SENSOR_BUSY_STATUS; 00534 break; 00535 } 00536 case (MMA5100_SENSOR_READY): 00537 { 00538 u16Status = MMA5100_SENSOR_READY_STATUS; 00539 break; 00540 } 00541 case (MMA5100_SENSOR_READY_UNLOCKED): 00542 { 00543 u16Status = MMA5100_SENSOR_READY_UNLOCKED_STATUS; 00544 break; 00545 } 00546 default: 00547 { 00548 u16Status = MMA5100_COMMAND_NOT_RECOGNIZED; 00549 break; 00550 } 00551 } 00552 00553 } 00554 00555 return (u16Status); 00556 } 00557 /* 00558 ****************************************************************************** 00559 * 00560 * End of file. 00561 * 00562 ****************************************************************************** 00563 */